﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using skags.Models;
using skags.Code;

namespace skags.Controllers
{
    public class ProfileController : Controller
    {
        ProfileRepository profileRep = new ProfileRepository();
        UserRepository userRep = new UserRepository();

        
        /* GET: /Profile/ 
         * Prófílsíða innskráðs notanda
         */
        [Authorize] // Notandi þarf að vera innskráður
        public ActionResult Index(int? pic)
        {
            var info = profileRep.GetProfileInfoByUserID(userRep.GetHashIDByUsername(HttpContext.User.Identity.Name));

            if( info != null)
                return View(info);

            // Notandi flyst annars á forsíðuna
            return RedirectToAction("Index", "Home");
        }

        /* GET: /Profile/User/5 
         * Síða sem notandi notar til að skoða annarra manna prófíla
         */
        public new ActionResult User(int id)
        {
            ViewData["UserName"] = HttpContext.User.Identity.Name;

            // Sækjum allar upplýsingar um viðkomandi og hendum inn í ViewModel
            var info = profileRep.GetProfileInfoByUserID(userRep.GetHashIDByID(id));

            // Ef við fáum engin gögn köstum við villu
            if (info == null)
                throw (new Exception("Þessi prófíll er ekki til!"));

            // Sendum gögnin inn í viewið
            return View(info);
        }

        /* GET: /Profile/Settings
         * Síða sem notandi notar til að breyta stillingum/upplýsingum sínum
         */
        [Authorize] // Notandi þarf að vera innskráður
        public ActionResult Settings()
        {
            ViewData["UserID"] = userRep.GetIDByUsername(HttpContext.User.Identity.Name);

            var curUser = userRep.GetHashIDByUsername(HttpContext.User.Identity.Name);

            var settings = profileRep.GetSettingsForUser(curUser);
            var info = profileRep.GetProfileInfoByUserID(userRep.GetHashIDByUsername(HttpContext.User.Identity.Name));

            return View(new ProfileSettingsViewModel { Info = info.Info, PrivacySettings = settings });
        }

        [Authorize]
        [HttpPost]
        /* POST: /Profile/Settings
         * Fall sem tekur við gögnum sem notandi ákveður að breyta um sjálfan sig
         */
        public ActionResult Settings(ProfileSettingsViewModel item)
        {
            // Köllum á fall sem sér um að vista upplýsingar um notanda
            profileRep.UpdateProfileSettings(item);

            return RedirectToAction("Settings");
        }

        [Authorize]
        [HttpPost]
        /* POST: /Profile/UploadProfilePic
         * Fall sem tekur við mynd sem notandi vill hafa sem prófílmyndina sína
         */
        public ActionResult UploadProfilePic(HttpPostedFileBase file)
        {
            // Skráin má ekki vera tóm
            if (file.ContentLength > 0)
            {
                // Stillingum upplýsingar um skránna
                var fileName = "user_" + Request.Form["userid"] + ".jpg";
                var path = Path.Combine(Server.MapPath("~/Content/users/"), fileName);
                file.SaveAs(path);
            }

            return RedirectToAction("Settings");
        }

        /* GET: /Profile/CreateChild
         * Fall sem birtir form þar sem notandi getur skráð barn í sinni eigu
         */
        [Authorize]
        public ActionResult CreateChild()
        {
            return View();
        }

        /* POST: /Profile/CreateChild
         * Fall sem tekur við gögnum sem notandi ákveður að skrá um barnið sitt
         */
        [Authorize]
        [HttpPost]
        public ActionResult CreateChild(Child child)
        {
            bool ok = true;

            if ((child.BirthDate.Equals("1.1.0001 00:00:00")) || child.BirthDate.ToString() == "1.1.0001 00:00:00")
            {
                ModelState.AddModelError("BirthDate","Þú verður að velja dagsetningu.");
                ok = false;
            }

            if(String.IsNullOrEmpty(child.Name))
            {
                ModelState.AddModelError("Name", "Nafnið má ekki vera tómt");
                ok = false;
            }

            if(!ok)
            {
                return View();
            }

            // Köllum á fall sem sér um að vista upplýsingar um nýja barnið
            profileRep.AddChildToParent(child);

            return RedirectToAction("CreateChild");
        }

        /* GET: /Profile/ChildList
         * Fall sem birtir öll börn notanda
         */
        [Authorize]
        public ActionResult ChildList()
        {
            // Köllum á fall sem sækir öll börn notanda og skilum því í viewið
            var model = profileRep.GetUsersChildren();
            return View(model);
        }

        /* GET: /Profile/EditChild
         * Fall sem birtir form fyrir notanda til að breyta barninu sínu
         */
        [Authorize]
        public ActionResult EditChild(int id)
        {
            // Köllum á fall sem nær í barnið sem notandi ætlar að breyta
            var item = profileRep.GetChildByID(id);

            // Ef upplýsingar um barn eru ekki fáanlegar köstum við villu
            if (item == null)
                throw new Exception("Barnið finnst ekki í kerfinu");

            return View(item);
        }

        /* POST: /Profile/EditChild
         * Fall sem tekur við gögnum sem notandi ákveður að breyta um barnið sitt
         */
        [Authorize]
        [HttpPost]
        public ActionResult EditChild(Child child)
        {
            bool ok = true;

            if ((child.BirthDate.Equals("1.1.0001 00:00:00") ) || child.BirthDate.ToString() == "1.1.0001 00:00:00" )
            {
                ModelState.AddModelError("BirthDate", "Þú verður að velja dagsetningu.");
                ok = false;
            }

            if (String.IsNullOrEmpty(child.Name))
            {
                ModelState.AddModelError("Name", "Nafnið má ekki vera tómt");
                ok = false;
            }

            if (!ok)
            {
                var item = profileRep.GetChildByID(child.ID);

                // Ef upplýsingar um barn eru ekki fáanlegar köstum við villu
                
                return View(item);
            }
            // Köllum á fall sem uppfærir upplýsingarnar um barnið
            profileRep.UpdateChild(child);
            return RedirectToAction("ChildList");
        }

        /* GET: /Profile/DeleteChild
         * Fall sem eyðir barni notanda
         */
        [Authorize]
        public ActionResult DeleteChild(int id)
        {
            // Sæki barnið sem á að eyða og  hash kóða núverandi notanda
            var childToRemove = profileRep.GetChildByID(id);
            var theUser = userRep.GetHashIDByUsername(HttpContext.User.Identity.Name);
            // Ef barnið er ekki til eða notandi á ekki barnið sem hann vill eyða
            if ((childToRemove == null)||(childToRemove.ParentID != theUser))
            {
                // Þá hendum við honum á forsíðu
                return RedirectToAction("Index");
            }
            else
            {
                // Annars er kallað á fall sem sér um að eyða barni
                profileRep.RemoveChild(childToRemove);
                return RedirectToAction("ChildList");
            }
        }

        /* GET: /Profile/SubmitArticle
         * Fall sem birtir notanda form til að senda inn grein til samþykkis stjórnanda
         */
        [Authorize]
        public ActionResult SubmitArticle()
        {
            var articleRep = new ArticleRepository();
            // Sækjum alla flokka greina til að notandi geti valið flokk fyrir greinina
            var allCategories = articleRep.GetAllCategories();

            return View(new ArticleCatViewModel { Categories = allCategories });
        }

        /* POST: /Profile/SubmitArticle
         * Fall sem tekur við grein sem notandi sendir inn til samþykkis
         */
        [Authorize]
        [HttpPost]
        [ValidateInput(false)] // Viljum leyfa HTML kóða
        public ActionResult SubmitArticle(Article item)
        {
            ArticleRepository articleRep = new ArticleRepository();

            // Sæki hash kóða höfundar
            item.CreatorID = userRep.GetHashIDByUsername(HttpContext.User.Identity.Name);
            // Núv. dagsetning
            item.DateCreated = DateTime.Now;

            bool ok = true;
            if (String.IsNullOrEmpty(item.Text)) //Athugum hvort reitir séu rétt útfylltir
            {
                ModelState.AddModelError("Text", "Fréttin má ekki vera tóm."); //Birtum villu ef það vantar textann
                ok = false;
            }

            if (String.IsNullOrEmpty(item.Title))
            {
                ModelState.AddModelError("Title", "Titillinn má ekki vera tómur.");
                ok = false;
            }

            if (!ok)
            {
                var allCategories = articleRep.GetAllCategories();

                return View(new ArticleCatViewModel { Categories = allCategories });
            }

            articleRep.AddArticle(item);

            return RedirectToAction("Index");
        }

        /* GET: /Profile/ApplyForPro
         * Fall sem leyfir notanda að sækja um að verða fagmaður
         */
        [Authorize]
        public ActionResult ApplyForPro()
        {
            // Ef notandi er nú þegar fagmaður eða stjórnandi
            if( HttpContext.User.IsInRole("Fagfolk") || HttpContext.User.IsInRole("Admin") )
                // Þá hendum við honum inn á forsíðuna
                return RedirectToAction("Index");

            // Annars fær hann að sækja um að vera fagmaður
            return View();
        }

        [HttpPost]
        [Authorize]
        public ActionResult ApplyForPro(FormCollection formdata)
        {
            var user = HttpContext.User.Identity.Name;
            EmailLogMedia mailman = new EmailLogMedia();
            mailman.ApplyForProMail(formdata["reason"], user);
            return RedirectToAction("Index");
        }

        /* GET: /Profile/TimelineList
         * Fall sem leyfir notanda að setja inn upplýsingar á tímalínu barns síns
         */
        [Authorize]
        public ActionResult TimelineList()
        {
            // Sækjum öll gögn á tímalínu barna notanda
            var model = profileRep.GetUsersTimelines();
            return View(model);
        }

        /* GET: /Profile/Timeline
         * Fall sem birtir tímalínu barns notanda
         */
        [Authorize]
        public ActionResult Timeline(int? id)
        {
            // Sækjum öll gögn á tímalínu barna
            var model = profileRep.GetChildTimelines(id);
            return View("Timeline", model);
        }

        /* GET: /Profile/AddToTimeline
         * Fall sem leyfir notanda að setja gögn inn á tímalínu barna sinna
         */
        [Authorize]
        public ActionResult AddToTimeline()
        {
            // Sækir upplýsingar um börn notanda
            var myChildren = profileRep.GetUsersChildren();
            

            return View(new addTimelineViewModel { Children = myChildren });
        }

        /* POST: /Profile/AddToTimeline
         * Fall sem vistar upplýsingar inn á tímalínu barns
         */
        [Authorize]
        [HttpPost]
        public ActionResult AddToTimeline(Timeline item)
        {

            bool ok = true;
            if ((item.LineDate.Equals("1.1.0001 00:00:00")) || item.LineDate.ToString() == "1.1.0001 00:00:00")
            {
                ModelState.AddModelError("LineDate", "Þú verður að velja dagsetningu"); //Birtum villu ef dags er ekki fyllt út
                ok = false;
            }

            if (ok)
            {
                profileRep.AddTimelineObject(item);

                return RedirectToAction("Timeline", new { id = item.ChildID });
            }


            var myChildren = profileRep.GetUsersChildren();


            return View(new addTimelineViewModel { Children = myChildren }); ;
            // Köllum á fall sem sér um að vista upplýsingar í gagnagrunni



        }

        /* GET: /Profile/WhoCurve
         * Fall sem birtir WHO kúrfu fyrir barn notanda
         */
        [Authorize]
        public ActionResult WhoCurve(int? id)
        {
            // Náum í allar mælingar barna notandans
            var model = profileRep.GetChildMeasurements(id);
            return View("WhoCurve", model);
        }

        /* GET: /Profile/AddMeasurements
         * Fall sem leyfir notanda að bæta inn mælingum um börn sín
         */
        [Authorize]
        public ActionResult AddMeasurements()
        {
            // Sækjum allar upplýsingar um börn notanda
            var myChildren = profileRep.GetUsersChildren();

            return View(new addTimelineViewModel { Children = myChildren });
        }

        /* POST: /Profile/AddMeasurements
         * Fall sem tekur við mælingum barna notanda
         */
        [Authorize]
        [HttpPost]
        public ActionResult AddMeasurements(Timeline item)
        {


            bool ok = true;
            if ((item.LineDate.Equals("1.1.0001 00:00:00")) || item.LineDate.ToString() == "1.1.0001 00:00:00")
            {
                ModelState.AddModelError("LineDate", "Þú verður að velja dagsetningu"); //Birtum villu ef dags er ekki fyllt út
                ok = false;
            }

            if (!item.CWeight.HasValue)
            {
                ModelState.AddModelError("CWeight", "Þú verður að setja inn þyngd (kg) í tölustöfum");
            }

            if (!item.CHeight.HasValue)
            {
                ModelState.AddModelError("CHeight", "Þú verður að setja inn hæð (cm) í tölustöfum");
            }

            if (!ok)
            {
                var myChildren = profileRep.GetUsersChildren();

                return View(new addTimelineViewModel { Children = myChildren });
            }
            // Köllum á fall sem sér um að vista upplýsingarnar í gagnagrunni
            profileRep.AddTimelineObject(item);

            return RedirectToAction("WhoCurve", new { id = item.ChildID });
        }

        /* GET: /Profile/ChildDrinking
         * Fall sem birtir reiknivél um hversu mikla mjólk barn á að drekka
         */
        [Authorize]
        public ActionResult ChildDrinking()
        {
            return View();
        }


        /* POST: /Profile/DeleteTimeline
         * Fall sem eyðir tímalínu barns notanda
         */
        [Authorize]
        public ActionResult DeleteTimeline(int id)
        {
            // Köllum á fall sem eyðir tímalínunni
            profileRep.DeleteTimeline(id);

            return RedirectToAction("TimelineList");
        }
      
        
    }
}